/** ****************************************************************************
@defgroup CascadeBus CascadeBus
@ingroup BSP_External
@brief Button 板间级联总线驱动
@addtogroup CascadeBus
@{
*******************************************************************************/

#ifndef __I2C_H
#define __I2C_H

#include <string.h>
#include <stm32f10x_i2c.h>

#include "share/byte_buffer.h"
#include "mcu.h"

#ifdef __cplusplus
extern "C" {
#endif


/// MCU I2C 接口 dummy 数据结构
typedef struct _st_i2c_port mcu_i2c_port;

/// I2C 总线驱动数据结构
typedef struct st_driver_i2c_t {
	/// I2C 端口地址
    mcu_i2c_port* port;
	/// I2C 接口硬件地址
	uint8_t addr;
    /// 接收数据缓冲区
	byte_buffer_t* rxbuf;
    /// 接收数据中断处理接口
    FUNC_onRxData rxhandler; void* rxcookie;
    /// 发送完成中断处理接口
    FUNC_callback txhandler; void* txcookie;
} driver_i2c_t;

/// @brief 初始化
std_err_t i2c_init(driver_i2c_t* dev, uint32_t speed);
/// @brief 中断处理函数
void i2c_irq_handler(driver_i2c_t* dev);
/// @brief 开始监听
std_err_t i2c_start_listen(driver_i2c_t* dev);
/// @brief 停止监听
std_err_t i2c_stop_listen(driver_i2c_t* dev);
/// @brief 使用指定硬件地址发送
/// @return 实际发送的数据长度
int i2c_send0(driver_i2c_t* dev, uint8_t srdAddr, const void* data, uint32_t len);
/// @brief 使用初始化时提供的接口硬件地址
/// @return 实际发送的数据长度
static inline int i2c_send(driver_i2c_t* dev, const void* data, uint32_t len) { return i2c_send0(dev, dev->addr, data, len); }
/// @brief 发送字符串
/// @return 实际发送的数据长度
static inline int i2c_send_str(driver_i2c_t* dev, const char* str) { return i2c_send0(dev, dev->addr, str, strlen(str)); }

	
#ifdef __cplusplus
}
#endif

#endif  // __I2C_H
